—————— Introducción a R - Manejar Datos ——————

“Herramientas de análisis cuantitativo y su aplicación en la conservación de la biodiversidad”

Ecodiversa Tropical


1. Objetivos de Aprendizaje

Al final de este taller, podrás aprender cómo:

  • Agrupar y resumir datos usando el paquete “dplyr”.
  • Usar las funciones mutate(), filter(), select(), group_by() y summarise() del paquete “dplyr” para modificar estructuras de datos.
  • Usar las funciones group_by() y summarise() para analizar estructuras de datos.
  • Cargar datos en varios formatos.
  • Usar las funciones pivot_longer() y pivot_wider() del paquete “tidyr” para modificar la disposición de estructuras de datos. Usar las funciones str_replace() y str_remove() del paquete “stringr” para manipular caracteres en estructuras de datos.

2. Para Empezar

Que es necesario para limpiar datos en R y por que es importante?

Ahora que hemos aprendido cómo visualizar datos, vamos a hablar sobre unos paquetes y funciones necesarios para manejar datos, que fueron útiles para crear visuales interesantes en el taller previo. Anteriormente, hablamos sobre la importancia de crear gráficos que resuenen con tu audiencia y reflejen tu mensaje deseado. Ahora que sabemos cómo lograr esto, es importante aprender a manipular datos para reflejar nuestro mensaje deseado.

Los datos vienen en muchos tipos de formas y lo que es útil o práctico para una aplicación no necesariamente funcionaría para otra. R tiene requisitos específicos sobre la configuración y los tipos de datos que se pueden pasar entre las funciones. Entonces, es muy importante tener la habilidad de manipular tus datos y darles la forma necesaria. Algunas de las funciones de las que hablaremos en este taller tienen el poder de manipular estructuras de datos mediante filtrado, reorganización y acomodo de caracteres.

¿Qué es necesario para manipular datos en R?

Ahora, vamos a instalar los paquetes que vamos a usar en este taller. Para empezar, vamos a instalar los paquetes “dplyr”, “tidyr” y “stringr”. Solo es necesario hacer esto una vez, ya que los paquetes se guardarán automáticamente en la sección “Packages” en RStudio. Los paquetes te dan acceso a todas las funciones creadas por el usuario y se pueden instalar usando la siguiente línea de código:

install.packages('dplyr')
install.packages('tidyr')
install.packages('stringr')

Cuando los paquetes terminen de instalarse, aparecerá un mensaje indicando que los paquetes fueron instalados con éxito!

3. Paquetes para crear graficos

3.1 dplyr

Dplyr es un paquete útil para reorganizar, modificar y manipular datos. Es posible que utilices este paquete con frecuencia en el laboratorio. Por favor, carga este paquete en R usando library(). Ahora, vamos a hablar de cinco funciones específicas en el paquete “dplyr”: filter(), mutate(), select(), group_by() y summarise().

Tips!

Recuerda que cada vez que abras R de nuevo y desees utilizar el paquete dplyr, debes cargarlo usando la función library().

library(dplyr)
library(tidyr)
library(stringr)
library(ggplot2)

Sin embargo, antes de adentrarnos en los detalles de cómo aplicar estas funciones, necesitamos hablar sobre la estructura de las funciones de dplyr. Afortunadamente, todas las funciones de dplyr siguen la misma estructura básica.

La primera parte de esta línea de código es la función dplyr, al igual que cualquier otra función en R. En la segunda parte de esta línea, encontrarás el nombre de la estructura de datos. En este caso, nuestra estructura de datos se llama “butterfly” y contiene datos cualitativos de una población de mariposas atlánticas del 2018. La tercera parte de la línea de código es una serie de comandos para especificar exactamente qué debe hacer la función dplyr. Puedes utilizar desde uno hasta miles de comandos en una función de dplyr para hacerla más general o específica.

En preparación para los ejemplos siguientes, por favor carga los datos “ATLANTIC_BUTTERFLIES_sites.csv” en R y asígnalos a un objeto con el nombre “butterfly”.

butterfly <- read.csv2("ATLANTIC_BUTTERFLIES_sites.csv")

En las siguientes líneas de código en este taller, las funciones no modificarán las estructuras de datos permanentemente con el propósito de los ejemplos instructivos. Para guardar las modificaciones de la estructura de datos, se debe asignar la función a un objeto.

Compara los dos ejemplos de código siguientes y presta atención a cuál código modifica la estructura de datos y se encuentra en el “environment”:

Código 1

filter(butterfly, sites_ID == "bor1122")
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
bor1122 Brazil BAHIA CRUZ DAS ALMAS Campus da Universidade Federal do Reconcavo Baiano -12.65 -39.11666667 Not Precise NA 220 139 23.14 1078 Atlantic Forests Bahia interior forests Floresta Estacional Semidecidual Diamantina

Código 2

butterfly_modified <- filter(butterfly, sites_ID == "bor1120")

3.2 dplyr: filter - filtrando datos basado en criteros

Una de las funciones más útiles de dplyr es filter(). Con esta función, es posible filtrar observaciones específicas basándose en las entradas en una o más columnas.

Ahora vamos a explorar la estructura de datos “butterfly” en más detalle. Podemos abrir la estructura utilizando la función view() o haciendo clic en “butterfly” en el panel de “data”. Aquí podemos ver que la columna “número de sitio” (sites_ID) tiene varios tipos diferentes de “números de sitio” (sites_ID). ¿Qué pasaría si quisiéramos crear una estructura de datos que solo incluya las observaciones del sitio “bor1001”? Esto es cuando utilizaríamos la función filter() en la siguiente línea de código:

filter(butterfly, sites_ID == "bor1001")
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria

Además, es posible filtrar observaciones numéricamente. Por ejemplo, para obtener una estructura de datos que contenga todos los sitios donde cayó más de 1000 mm de lluvia, utilizaremos la siguiente línea de código. Presta atención a que cuando filtras por número, no es necesario poner comillas al número.

filter(butterfly, A_rainfall >= 1000)
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
bor1002 Brazil RIO GRANDE DO SUL SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900 917 14.94 2083 Atlantic Forests Araucaria moist forests Estepe Florestas de Araucaria
bor1003 Brazil RIO GRANDE DO SUL SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100 99 19.86 1665 NA Uruguayan savanna Areas de Tensao Ecologica Florestas de Interior
bor1004 Brazil PARANA CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000 956 16.69 1641 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
bor1005 Brazil PARANA LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600 571 20.65 1598 Atlantic Forests Alto Parana Atlantic forests Floresta Estacional Semidecidual Florestas de Interior

Finalmente, es posible usar un número infinito de condiciones para filtrar la estructura de datos, todo dentro de la misma línea de código. Por ejemplo, si quisieras crear una estructura de datos que contenga solamente los sitios en Río de Janeiro donde cayó más de 1000 mm de lluvia, usarías esta línea de código:

filter(butterfly, State == "RIO DE JANEIRO", A_rainfall >= 1000)
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
bor1018 Brazil RIO DE JANEIRO ITATIAIA Paque Nacional do Itatiaia -22.375278 -44.662222 9000 28086.06751 2000-2600 2534 9.39 2300 Atlantic Forests Campos Rupestres montane savanna Floresta Ombrofila Densa Florestas de Interior
bor1019 Brazil RIO DE JANEIRO GUAPIMIRIM Guapimirim -22.49305556 -42.94916667 30 NA 50-250 305 22 1441 Atlantic Forests Serra do Mar coastal forests Floresta Ombrofila Densa Serra do Mar
bor1020 Brazil RIO DE JANEIRO CACHOEIRAS DE MACACU Reserva Ecologica de Guapiacu -22.45388889 -42.77166667 30 7.385 30-180 120 22.85 1284 Atlantic Forests Serra do Mar coastal forests Floresta Ombrofila Densa Serra do Mar
bor1021 Brazil RIO DE JANEIRO CACHOEIRAS DE MACACU Boca do Mato -22.40583333 -42.60694444 30 NA 200-450 488 20.28 1277 Atlantic Forests Serra do Mar coastal forests Floresta Ombrofila Densa Serra do Mar
bor1022 Brazil RIO DE JANEIRO PETROPOLIS Independencia and Alto Xerem and Petropolis -22.54416667 -43.20472222 30 NA 900-1000 592 18.38 1867 Atlantic Forests Serra do Mar coastal forests Floresta Ombrofila Densa Serra do Mar

Información!

La función filter() filtrará en el orden en que los elementos son listados en la función. Por ejemplo, para la línea de código previa, R filtrará por “estado” (State) y luego por “cantidad de lluvia” (A_rainfall). Con esta información, presta atención al orden de los elementos para filtrar tus datos de la manera que desees.

3.3 dplyr: select() - modificando estructaras de datos basado en nombre de las columnas

Otra función importante es la función select(). Esta función es similar al uso del símbolo “$” porque ambas te permiten examinar una parte específica de la estructura de datos. Esta función es particularmente útil cuando estás trabajando con estructuras de datos extensas. Específicamente, la función select() te permite seleccionar una o más columnas de tu estructura de datos y transferirlas a una nueva estructura de datos.

Por ejemplo, imagina que deseas crear una estructura de datos que contenga solamente las columnas “numero de sitio” (sites_ID) y “estado” (State) de la estructura de datos original, “butterfly”. Puedes lograr esto utilizando la siguiente línea de código:

select(butterfly,sites_ID, State)
sites_ID State
bor1001 RIO GRANDE DO SUL
bor1002 RIO GRANDE DO SUL
bor1003 RIO GRANDE DO SUL
bor1004 PARANA
bor1005 PARANA

Información!

Las diferentes columnas que seleccionaste están dividas entre comas y los nombres de las columnas tienen que tener los mismos nombres de la estructura de datos original (esto incluye el uso de mayúsculas, espacios, guiones,periodos, etc).

Si planillas a crear una estructura de datos que contiene la mayoría de columnas de la estructura original, puede ser tedioso a listar todos los nombres de las columnas. Afortunadamente, la función select() permite quitar columnas usando el símbolo “-”. Ahora, imagine que queremos a crear una estructura de datos que contiene todas las columnas de la original “butterfly” estructura excluyendo “numero de sitio” (sites_ID) y “estado” (State) utilizáramos la siguiente linea de código:

select(butterfly,-sites_ID, -State)
Country Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs
Brazil MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
Brazil SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900 917 14.94 2083 Atlantic Forests Araucaria moist forests Estepe Florestas de Araucaria
Brazil SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100 99 19.86 1665 NA Uruguayan savanna Areas de Tensao Ecologica Florestas de Interior
Brazil CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000 956 16.69 1641 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria
Brazil LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600 571 20.65 1598 Atlantic Forests Alto Parana Atlantic forests Floresta Estacional Semidecidual Florestas de Interior

Finalmente, imagina que quieres crear una estructura de datos que contenga columnas que estén agrupadas en la estructura original. En este caso, puedes usar el símbolo “:” para ahorrar tiempo al escribir todos los nombres de las columnas. Por ejemplo, presta atención a la estructura “butterfly” e imagina que quieres crear una nueva estructura de datos que contenga las primeras cuatro columnas de la estructura “butterfly”, desde “numero de sitio” (sites_ID) hasta “altitud” (altitude). Para lograr esto, puedes utilizar la siguiente línea de código:

select(butterfly, sites_ID:Altitude)
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300
bor1002 Brazil RIO GRANDE DO SUL SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900
bor1003 Brazil RIO GRANDE DO SUL SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100
bor1004 Brazil PARANA CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000
bor1005 Brazil PARANA LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600

3.4 dplyr: mutate - agregando columnas a estructuras de datos

La función mutate() se utiliza para agregar columnas a una estructura de datos existente. La nueva columna generalmente es una función de una o más de las columnas existentes. Por ejemplo, imagina que quieres añadir una columna a la estructura “butterfly” que sea igual al logaritmo de la columna “A_rainfall”. Esta acción se puede realizar de dos maneras.

Primero, puedes crear una nueva estructura de datos que incluya todas las columnas presentes en la estructura original de “butterfly”, con la nueva adición. Esto es similar a los ejemplos anteriores con filter() y select():

mutate(butterfly, Log_Rainfall = log(A_rainfall))
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs Log_Rainfall
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria 7.357556
bor1002 Brazil RIO GRANDE DO SUL SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900 917 14.94 2083 Atlantic Forests Araucaria moist forests Estepe Florestas de Araucaria 7.641564
bor1003 Brazil RIO GRANDE DO SUL SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100 99 19.86 1665 NA Uruguayan savanna Areas de Tensao Ecologica Florestas de Interior 7.417580
bor1004 Brazil PARANA CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000 956 16.69 1641 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria 7.403061
bor1005 Brazil PARANA LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600 571 20.65 1598 Atlantic Forests Alto Parana Atlantic forests Floresta Estacional Semidecidual Florestas de Interior 7.376508

También es posible añadir más de una columna a una estructura de datos utilizando la siguiente línea de código:

mutate(butterfly, Log_Rainfall = log(A_rainfall), climate_index = A_mean_temp * A_rainfall)

En esta linea de código, añadimos dos columnas, la columna previa que toma el logaritmo de la columna “A_rainfall” y una nueva columna, “climate_index”, que calcula el indice de clima con multiplicar las columnas “A_rainfall” y “A_mean_temp”.

Que pasa cuando ejecutas la linea de codigo previa?

R indica un error al calcular el índice climático debido a que la columna de temperatura, “A_mean_temp”, no es numérica.

Para examinar la estructura de datos “butterfly”, recuerda que es posible utilizar la función str():

str(butterfly)
## 'data.frame':    122 obs. of  17 variables:
##  $ sites_ID      : chr  "bor1001" "bor1002" "bor1003" "bor1004" ...
##  $ Country       : chr  "Brazil" "Brazil" "Brazil" "Brazil" ...
##  $ State         : chr  "RIO GRANDE DO SUL" "RIO GRANDE DO SUL" "RIO GRANDE DO SUL" "PARANA" ...
##  $ Municipality  : chr  "MAQUINE" "SAO FRANCISCO DE PAULA" "SANTA MARIA" "CURITIBA" ...
##  $ Study.Location: chr  "Maquine" "Floresta Nacional de Sao Francisco de Paula" "Santa Maria" "Curitiba" ...
##  $ Latitude      : chr  "-29.58333333" "-29.423669" "-29.747514" "-25.3" ...
##  $ Longitude     : chr  "-50.26666667" "-50.386914" "-53.838197" "-49.36666667" ...
##  $ Precision     : chr  "13000" "2200" "30" "12000" ...
##  $ Reserve_Area  : chr  NA "1615" NA NA ...
##  $ Altitude      : chr  "100-300" "900" "50-100" "850-1000" ...
##  $ Altitude1km   : int  305 917 99 956 571 936 442 280 139 803 ...
##  $ A_mean_temp   : chr  "18.68" "14.94" "19.86" "16.69" ...
##  $ A_rainfall    : int  1568 2083 1665 1641 1598 1691 1256 1202 1763 1431 ...
##  $ Olsong200r    : chr  "Atlantic Forests" "Atlantic Forests" NA "Atlantic Forests" ...
##  $ Olsoneconame  : chr  "Araucaria moist forests" "Araucaria moist forests" "Uruguayan savanna" "Araucaria moist forests" ...
##  $ Ribeirovegtype: chr  "Floresta Ombrofila Mista" "Estepe" "Areas de Tensao Ecologica" "Floresta Ombrofila Mista" ...
##  $ BSRs          : chr  "Florestas de Araucaria" "Florestas de Araucaria" "Florestas de Interior" "Florestas de Araucaria" ...

Al usar la función str(), podemos confirmar que la columna “A_mean_temp” está clasificada como un carácter en lugar de ser numérica:

Entonces, para realizar la operación de multiplicación y calcular el índice climático, debemos cambiar la columna “A_mean_temp” a formato numérico utilizando la siguiente línea de código:

butterfly <- mutate(butterfly, A_mean_temp = as.numeric(A_mean_temp))

mutate(butterfly, Log_Rainfall = log(A_rainfall), climate_index = A_mean_temp * A_rainfall)
sites_ID Country State Municipality Study.Location Latitude Longitude Precision Reserve_Area Altitude Altitude1km A_mean_temp A_rainfall Olsong200r Olsoneconame Ribeirovegtype BSRs Log_Rainfall climate_index
bor1001 Brazil RIO GRANDE DO SUL MAQUINE Maquine -29.58333333 -50.26666667 13000 NA 100-300 305 18.68 1568 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria 7.357556 29290.24
bor1002 Brazil RIO GRANDE DO SUL SAO FRANCISCO DE PAULA Floresta Nacional de Sao Francisco de Paula -29.423669 -50.386914 2200 1615 900 917 14.94 2083 Atlantic Forests Araucaria moist forests Estepe Florestas de Araucaria 7.641564 31120.02
bor1003 Brazil RIO GRANDE DO SUL SANTA MARIA Santa Maria -29.747514 -53.838197 30 NA 50-100 99 19.86 1665 NA Uruguayan savanna Areas de Tensao Ecologica Florestas de Interior 7.417580 33066.90
bor1004 Brazil PARANA CURITIBA Curitiba -25.3 -49.36666667 12000 NA 850-1000 956 16.69 1641 Atlantic Forests Araucaria moist forests Floresta Ombrofila Mista Florestas de Araucaria 7.403061 27388.29
bor1005 Brazil PARANA LONDRINA Londrina -23.306445 -51.170618 Not Precise NA 500-600 571 20.65 1598 Atlantic Forests Alto Parana Atlantic forests Floresta Estacional Semidecidual Florestas de Interior 7.376508 32998.70

Aquí, nos vemos obligados a crear una nueva estructura de datos para poder agregar dos o más columnas por separado a la estructura existente.

3.5 dplyr: group_by - categorizando una estructura de datos por nombre de columnas

Continuaremos explorando más funciones del paquete “dplyr”. En esta ocasión, utilizaremos la función group_by(). Esta función es útil cuando tienes dos variables categóricas y deseas analizar cuántos elementos pertenecen a cada grupo en una u otra categoría. La función group_by() crea una estructura de datos que reorganiza la estructura original basándose en columnas específicas.

Esta función es especialmente útil cuando se combina con la función summarise(), de la cual aprenderemos más en la siguiente sección.

Grouped_Sites <- group_by(butterfly, sites_ID)
Grouped_Sites
## # A tibble: 122 × 17
## # Groups:   sites_ID [122]
##    sites_ID Country State         Municipality Study.Location Latitude Longitude
##    <chr>    <chr>   <chr>         <chr>        <chr>          <chr>    <chr>    
##  1 bor1001  Brazil  RIO GRANDE D… MAQUINE      Maquine        -29.583… -50.2666…
##  2 bor1002  Brazil  RIO GRANDE D… SAO FRANCIS… Floresta Naci… -29.423… -50.3869…
##  3 bor1003  Brazil  RIO GRANDE D… SANTA MARIA  Santa Maria    -29.747… -53.8381…
##  4 bor1004  Brazil  PARANA        CURITIBA     Curitiba       -25.3    -49.3666…
##  5 bor1005  Brazil  PARANA        LONDRINA     Londrina       -23.306… -51.1706…
##  6 bor1006  Brazil  PARANA        GUARAPUAVA   Guarapuava     -25.402… -51.4211…
##  7 bor1007  Brazil  PARANA        MARINGA      Maringa        -23.435… -51.9430…
##  8 bor1008  Brazil  PARANA        DIAMANTE DO… Estacao Ecolo… -22.618… -52.8566…
##  9 bor1009  Brazil  RIO GRANDE D… PORTO MAUA   Porto Maua     -27.516… -54.6666…
## 10 bor1010  Brazil  PARANA        BALSA NOVA   Sao Luiz do P… -25.760… -50.1777…
## # ℹ 112 more rows
## # ℹ 10 more variables: Precision <chr>, Reserve_Area <chr>, Altitude <chr>,
## #   Altitude1km <int>, A_mean_temp <dbl>, A_rainfall <int>, Olsong200r <chr>,
## #   Olsoneconame <chr>, Ribeirovegtype <chr>, BSRs <chr>

Mirando los resultados de la función group_by(), notarás que la estructura de datos ahora está organizada por categoría, pero sigue siendo muy similar a la estructura original.

3.6 dplyr: summarise - agregando columnas sumadas a estructuras de datos

Ahora, retomaremos la función summarise() que mencionamos en la sección anterior. Esta función calcula una estadística específica en las columnas indicadas en tu línea de código y guarda estos valores en una nueva columna que se agrega a tu estructura de datos. Cuando se utilizan las funciones summarise() y group_by() juntas, la estadística se calcula para cada grupo. Por ejemplo, contaremos el número de ocurrencias en cada grupo de nuestra estructura de datos “butterfly” utilizando la función n().

summarise(Grouped_Sites, n())
sites_ID n()
bor1001 1
bor1002 1
bor1003 1
bor1004 1
bor1005 1

4. tidyr

Además, tidyr es otro paquete que puede ayudar al usuario a manipular una estructura de datos. El paquete tidyr es especialmente útil para transformar una estructura de datos de un formato largo a un formato ancho, y viceversa.

Información!

Una estructura de datos en formato largo contiene valores que no se repiten en la primera columna. En cambio, una estructura de datos en formato ancho contiene valores que se repiten en la primera columna. Por ejemplo, considera las dos estructuras de datos que contienen los mismos datos pero en diferentes formatos:

Pero, ¿por qué es importante manipular una estructura de datos de esta manera? Los paquetes “ggplot” y “ggplot2”, que utilizamos en el taller anterior para crear gráficos, prefieren visualizar una estructura de datos en formato largo en lugar de formato ancho.

Recuerda que cada vez que abras R de nuevo y desees utilizar el paquete “tidyr”, debes cargarlo usando la función library().

library(tidyr)

4.1 tidyr: pivot_longer - modificando estructuras de datos a formato larga

La primera función importante del paquete tidyr es pivot_longer(). Esta función cambia el formato de una estructura de datos, aumentando el número de filas y reduciendo el número de columnas, creando una estructura de datos en formato largo.

Vamos a utilizar la estructura de datos sin modificar, “polar”, del taller anterior para explorar esta función. Recuerda cargar la estructura de datos usando la siguiente línea:

polar <- read.delim("ANT-XXVIII_5_seabirds_marine_mammals.tab", skip = 154)

Para manipular la estructura de datos “polar” a formato largo, puedes utilizar la siguiente línea de código:

polar_longer <- pivot_longer(polar, names_to = 'species', values_to = 'abundance', `E..chrysocome......Rockhopper.penguin.`:`Mola.mola......Sun.fish.`)
polar_longer
ID..Consecutive.number.of.transec…. Date.Time..Starting.time..UTC..of.30.min…. Latitude..Mid.latitude.of.30.min.transe…. Longitude..Mid.longitude.of.30.min.trans…. Bathy.depth..m…Mid.mean.water.depth.of.30.mi…. Speed..kn…Average.speed.of.the.vessel.d…. Distance..km…Distance.covered.during.30.mi…. Sal..Mid.mean.surface.salinity.of….. Temp…C…Mid.mean.surface.water.temper…. F.chl..µg.l…Mid.fluorescence.of.30.min.tr…. Zone..Zones..which.were.defined.on….. species abundance
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.386 5.35 10 E..chrysocome……Rockhopper.penguin. 0
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.386 5.35 10 S..magellanicus……Magellanic.penguin. 0
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.386 5.35 10 Penguins……Penguin.sp.. 0
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.386 5.35 10 T..melanophris……Black.browed.albatross. 16
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.386 5.35 10 T..cauta……Shy.albatross. 0

4.2 tidyr: pivot_wider - modificando estructuras de datos a formato ancho

La segunda función de la que hablaremos es el inverso de la primera función. El inverso de pivot_longer es pivot_wider. Esta función manipula la estructura de datos al formato ancho, aumentando el número de columnas y reduciendo el número de filas.

Para manipular la estructura de datos “polar_longer” al formato ancho, puedes utilizar la siguiente línea de código:

polar_wider <- pivot_wider(polar_longer, names_from = 'species', values_from = 'abundance')
polar_wider
ID..Consecutive.number.of.transec…. Date.Time..Starting.time..UTC..of.30.min…. Latitude..Mid.latitude.of.30.min.transe…. Longitude..Mid.longitude.of.30.min.trans…. Bathy.depth..m…Mid.mean.water.depth.of.30.mi…. Speed..kn…Average.speed.of.the.vessel.d…. Distance..km…Distance.covered.during.30.mi…. Sal..Mid.mean.surface.salinity.of….. Temp…C…Mid.mean.surface.water.temper…. F.chl..µg.l…Mid.fluorescence.of.30.min.tr…. Zone..Zones..which.were.defined.on….. E..chrysocome……Rockhopper.penguin. S..magellanicus……Magellanic.penguin. Penguins……Penguin.sp.. T..melanophris……Black.browed.albatross. T..cauta……Shy.albatross. T..chlororhynchos……Atlantic.yellow.nosed.albatross. D..exulans……Wandering.albatross. D..dabbenena……Tristan.albatross. Diomedea.sp…….Great.albatrosses.sp.. D..epomophora……Southern.royal.albatross. D..sanfordi……Northern.royal.albatross. D..epomophora……including.Diomedea.sanfordi. Albatrosses……Albatross.sp.. M..giganteus……Southern.giant.petrel. Macronectes.sp…….Giant.petrel.sp.. F..glacialis……Northern.fulmar. D..capense……Cape.petrel. P..macroptera……Great.winged.petrel. P..feae……Fea.s.petrel. P..incerta……Atlantic.petrel. P..arminjoniana……Trinidade.petrel. P..mollis……Soft.plumaged.petrel. B..bulwerii……Bulwer.s.petrel. P..aequinoctialis……White.chinned.petrel. P..conspicillata……Spectacled.petrel. Petrels……Petrel.sp.. Pachyptila.sp…….including.Halobaena.sp.. C..diomedea……Cory.s.shearwater. C..edwardsii……Cape.Verde.shearwater. P..gravis……Great.shearwater. P..griseus……Sooty.shearwater. P..puffinus……Manx.shearwater. P..mauretanicus……Balearic.shearwater. P..baroli……Macaronesian.shearwater. P..lherminieri……Audubon.s.shearwater. P..assimilis……Little.shearwater. Shearwaters……Shearwater.sp.. O..oceanicus……Wilson.s.storm.petrel. G..nereis……Grey.backed.storm.petrel. P..marina……White.faced.storm.petrel. F..grallaria……White.bellied.storm.petrel. O..castro……Madeiran.storm.petrel. O..leucorhoa……Leach.s.storm.petrel. O..castro……including.Oceanodroma.leucorhoa. H..pelagicus……European.storm.petrel. Storm.petrels……Storm.petrel.sp.. P..aethereus……Red.billed.tropicbird. P..lepturus……White.tailed.tropicbird. Tropicbirds……Tropicbird.sp.. F..aquila……Ascension.frigatebird. F..magnificens……Magnificent.frigatebird. M..bassanus……Northern.gannet. S..capensis……Cape.gannet. S..sula……Red.footed.booby. S..leucogaster……Brown.booby. C..skua……Great.skua. C..maccormicki……South.polar.skua. C..antarctica……Antarctic.skua. S..pomarinus……Pomarine.skua. S..parasiticus……Arctic.skua. S..longicaudus……Long.tailed.skua. Skuas……Skua.sp.. B..bernicla……Brent.goose. G..arctica……Black.throated.diver. P..capensis……Cape.cormorant. P..coronatus……Crowned.cormorant. P..carbo……Great.cormorant. P..magellani……Magellanic.diving.petrel. Pelecanoides.sp…….Diving.petrel.sp.. P..fulicarius……Red.phalarope. L..canus……Common.gull. L..melanocephalus……Mediteranean.gull. L..argentatus……Herring.gull. L..fuscus……Lesser.black.backed.gull. L..michahellis……Yellow.legged.gull. L..dominicanus……Cape.gull. L..marinus……Great.black.backed.gull. L..ridibundus……Black.headed.gull. L..minutus……Little.gull. R..tridactyla……Black.legged.kittiwake. X..sabini……Sabine.s.gull. Gulls……Gull.sp.. S..hirundo……Common.tern. S..arctica……Arctic.tern. S..dougallii……Roseate.tern. S..anaethetus……Bridled.tern. S..fuscata……Sooty.tern. S..sandvicensis……Sandwich.tern. T..maximus……Royal.tern. C..niger……Black.tern. T..bergii……Crested.tern. Terns……Tern.sp.. A..stolidus……Brown.noddy. U..aalge……Guillemot. A..torda……Razorbill. Alcidae.sp…….Alcidae.sp.. Seabird.unident……Seabird..unidentified. P..catodon……Sperm.whale. M..novaeangliae……Humpback.whale. B..physalus……Fin.whale. B..borealis……Sei.whale. B..acutorostrata……Minke.whale. B..brydei……Bryde.s.whale. G..melas……Long.finned.pilot.whale. G..macrorhynchus……Short.finned.pilot.whale. Globicephala.sp…….Pilot.whale.sp.. Z..cavirostris……Cuvier.s.beaked.whale. Beaked.whale……Beaked.whale.sp.. Whale.unident……Whale..unidentified. O..orca……Killer.whale. L..australis……Peale.s.dolphin. L..albirostris……White.beacked.dolphin. Lagenorhynchus.sp…….Lagenorhynchus.sp.. D..delphis……Common.dolphin. S..frontalis……Atlantic.spotted.dolphin. S..coeruleoalba……Striped.dolphin. S..clymene……Clymene.dolphin. T..truncatus……Bottlenose.dolphin. G..griseus……Risso.s.dolphin. S..bredanensis……Rough.toothed.dolphin. S..longirostris……Spinner.dolphin. Dolphin.unident……Dolphin..unidentified. P..phocoena……Harbour.porpoise. A..pusillus……South.African.fur.seal. C..caretta……Loggerhead.sea.turtle. C..mydas……Green.sea.turtle. D..coriacea……Leatherback.sea.turtle. Sea.turtles……Sea.turtle.sp.. Manta.sp…….Manta.ray. Ray……Ray. Hammerhead.shark……Hammerhead.shark. Shark……Shark. Mola.mola……Sun.fish.
1 2012-04-11T13:30 -51.48 -66.86 108 8.8 8.1488 32.9347 8.3860 5.35 10 0 0 0 16 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 9 0 0 0 0 0 38 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 2012-04-11T14:00 -51.41 -66.80 115 9.3 8.6118 32.9383 8.2629 5.49 10 0 0 0 7 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 29 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
3 2012-04-11T14:30 -51.34 -66.74 124 9.4 8.7044 32.9225 8.4985 5.49 10 0 0 0 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 32 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 2012-04-11T15:00 -51.28 -66.67 117 9.2 8.5192 32.9378 8.4757 5.75 10 0 0 0 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 22 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 2012-04-11T15:30 -51.21 -66.61 123 5.7 5.2782 32.9560 8.2094 5.80 10 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 297 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

5. stringr

Por último, otro paquete útil cuando se trabaja con datos, especialmente cuando se trabaja con caracteres o “strings”, es “stringr”. Este paquete puede manipular caracteres individuales dentro de un vector de caracteres, anidar o eliminar espacios en blanco e identificar patrones en un vector de caracteres.

Información!

Las funciones del paquete “stringr” comienzan con “str_”, lo cual puede ser similar a la función str() que discutimos en el taller anterior. Sin embargo, no hay relación entre estas funciones, ya que str() muestra la estructura de un conjunto de datos.

Tips!

Recuerda que cada vez que abras R de nuevo y desees usar el paquete “stringr”, debes cargarlo usando la función library().

library(stringr)

En la siguiente parte del taller, vamos a usar el conjunto de datos “parrot”. La diferencia es que estos datos son la versión original y sin modificaciones de “parrot_clean” del taller previo. Empezamos cargando los datos y asignándolos al objeto “parrot”:

parrot <- read.delim("Ferrer-Paris_2013.tab", skip = 27)
colnames_parrot <- colnames(parrot)

# 5.1 stringr: str_replace - reemplazar characteres en estructuras de datos

La primera función del paquete “stringr” de la que hablaremos es str_replace(). Esta función es importante cuando se desea reemplazar caracteres específicos en una estructura de datos. En la estructura de datos “parrot”, los nombres de las especies están separados por puntos. Por ejemplo, el nombre de la primera especie está escrito como “A..Amazonica….”. Vamos a utilizar la siguiente línea de código para reemplazar el primer par de puntos con un guion bajo:

parrot_replace <- str_replace(colnames_parrot, "\\.\\.", "_")
parrot_replace
##  [1] "Longitude"          "Latitude"           "Code"              
##  [4] "Time_min."          "Date.Time"          "A_amazonica...."   
##  [7] "A_autumnalis...."   "A_barbadensis...."  "A_dufresniana...." 
## [10] "A_farinosa...."     "A_festiva...."      "A_mercenaria...."  
## [13] "A_ochrocephala...."

5.2 stringr: str_remove - eliminar characteres en estructura de datos

Similar a str_replace(), la función str_remove() permite quitar caracteres específicos de una estructura de datos. Ahora que hemos reemplazado el primer grupo de puntos con un guion bajo, vamos a utilizar la función str_remove() para eliminar el segundo grupo de puntos al final del nombre de las especies. Usaremos la siguiente línea de código:

parrot_remove <- str_remove(parrot_replace, "\\.\\.\\.\\.")
parrot_remove
##  [1] "Longitude"      "Latitude"       "Code"           "Time_min."     
##  [5] "Date.Time"      "A_amazonica"    "A_autumnalis"   "A_barbadensis" 
##  [9] "A_dufresniana"  "A_farinosa"     "A_festiva"      "A_mercenaria"  
## [13] "A_ochrocephala"

Ahora que hemos limpiado los nombres de las columnas, podemos reemplazar los nombres en la estructura de datos (recuerda que extraemos los nombres cuando realizamos cambios) utilizando la siguiente línea de código:

colnames(parrot) <- parrot_remove

Información!

Al utilizar las funciones del paquete “stringr”, es importante tener en cuenta que los ejemplos de las dos funciones anteriores solo ejecutan el comando para la primera ocurrencia. Para aplicar el comando a todas las ocurrencias, el usuario debe agregar “_all” a la línea de código.

Consulta la solución del ejercicio cinco para un ejemplo de cómo realizar los cambios en los nombres en un solo paso utilizando str_remove_all().

6. Ayuda en la web

Si necesitas más información sobre las funciones de los paquetes mencionados, puedes consultar la documentación en línea:

A continuación, te presento unos ejercicios para poner en práctica lo aprendido:

Practica!

Ejercicio 1

Lee el archivo de ayuda para la función filter() en el paquete “dplyr”. ¿Cuáles son las funciones de las diferentes partes de esta línea de código? Completa las líneas en el gráfico siguiente usando la información en “usage”, “arguments” y “examples”.

Haz clic aquí para solucion!

A. El objeto conteniendo los datos

B. Expresiónes que entregan “True” o “False”

Ejercicio 2

Usando la estructura de datos “parrot_data”, agrega una columna que muestre la suma de las abundancias para cada especie. Verifica que la columna fue añadida usando la función head(). Nota: esta estructura de datos es otra versión modificada de la versión original, “parrot”. Presta atención a utilizar el conjunto de datos correcto.

Haz clic aquí para solucion!
parrot_data <- read.csv("venezuelan_parrots_wide.csv")

parrot_data_total <- parrot_data %>% 
  group_by(site) %>% 
  summarise_all(sum) %>%
  rowwise() %>%
  mutate(total_abundance = sum(c_across(A_amazonica:A_ochrocephala)) )

head(parrot_data_total)
## # A tibble: 6 × 6
## # Rowwise: 
##   site  A_amazonica A_barbadensis A_farinosa A_ochrocephala total_abundance
##   <chr>       <int>         <int>      <int>          <int>           <int>
## 1 NM01            0             0          0              0               0
## 2 NM02            0             0          0              0               0
## 3 NM03            1             0          0              3               4
## 4 NM05            0             0         10             11              21
## 5 NM07            4             0          2              8              14
## 6 NM08            8             0          0              2              10

Ejercicio 3

Primero, utilizando la estructura de datos “butterfly”, agrupa la estructura de datos por “estado” (state) y suma los valores obtenidos por el número de ocurrencias. Segundo, visualiza los datos modificados en forma de un gráfico de barras mostrando el número de ocurrencias por estado.

Haz clic aquí para solución!
butterfly_state <- butterfly %>%
  group_by(State) %>% 
  summarise(n_spe = n())

ggplot(data = butterfly_state, aes(x = State, y = n_spe)) + geom_bar(stat = "identity")

En el gráfico resultante, vemos que es difícil leer los nombres en el axis horizontal. Para corregir esto,es posible utilizar la adición a el código siguiente:

 ggplot(data = butterfly_state, aes(x = State, y = n_spe)) + geom_bar(stat = "identity") +
  theme(axis.text = element_text(angle = 90))

Ejercicio 4

Utilizando la estructura de datos “polar”, crea un nuevo objeto llamado “high_temp” utilizando la función filter() para demostrar todas las temperaturas mayores a 23 grados Celsius. Luego, utiliza la función mutate() para crear una nueva columna con valores de “Verdadero/Falso” y ejecuta el comando anterior. Pista: utiliza la función mutate() para crear una nueva columna.

Haz clic aquí para solución!
str(polar)
## 'data.frame':    655 obs. of  144 variables:
##  $ ID..Consecutive.number.of.transec....                  : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ Date.Time..Starting.time..UTC..of.30.min....           : chr  "2012-04-11T13:30" "2012-04-11T14:00" "2012-04-11T14:30" "2012-04-11T15:00" ...
##  $ Latitude..Mid.latitude.of.30.min.transe....            : num  -51.5 -51.4 -51.3 -51.3 -51.2 ...
##  $ Longitude..Mid.longitude.of.30.min.trans....           : num  -66.9 -66.8 -66.7 -66.7 -66.6 ...
##  $ Bathy.depth..m...Mid.mean.water.depth.of.30.mi....     : int  108 115 124 117 123 121 122 121 122 NA ...
##  $ Speed..kn...Average.speed.of.the.vessel.d....          : num  8.8 9.3 9.4 9.2 5.7 9.7 9.3 9.2 9.9 9.8 ...
##  $ Distance..km...Distance.covered.during.30.mi....       : num  8.15 8.61 8.7 8.52 5.28 ...
##  $ Sal..Mid.mean.surface.salinity.of.....                 : num  32.9 32.9 32.9 32.9 33 ...
##  $ Temp...C...Mid.mean.surface.water.temper....           : num  8.39 8.26 8.5 8.48 8.21 ...
##  $ F.chl..µg.l...Mid.fluorescence.of.30.min.tr....        : num  5.35 5.49 5.49 5.75 5.8 6.01 6.14 6.5 6.61 6.91 ...
##  $ Zone..Zones..which.were.defined.on.....                : int  10 10 10 10 10 10 10 10 10 10 ...
##  $ E..chrysocome......Rockhopper.penguin.                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..magellanicus......Magellanic.penguin.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Penguins......Penguin.sp..                             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ T..melanophris......Black.browed.albatross.            : int  16 7 14 13 1 8 0 7 2 1 ...
##  $ T..cauta......Shy.albatross.                           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ T..chlororhynchos......Atlantic.yellow.nosed.albatross.: int  0 0 0 0 0 0 0 0 0 0 ...
##  $ D..exulans......Wandering.albatross.                   : int  0 0 0 0 0 1 0 0 0 0 ...
##  $ D..dabbenena......Tristan.albatross.                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Diomedea.sp.......Great.albatrosses.sp..               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ D..epomophora......Southern.royal.albatross.           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ D..sanfordi......Northern.royal.albatross.             : int  0 2 0 0 0 0 0 0 0 0 ...
##  $ D..epomophora......including.Diomedea.sanfordi.        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Albatrosses......Albatross.sp..                        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ M..giganteus......Southern.giant.petrel.               : int  0 0 0 0 0 0 1 2 0 2 ...
##  $ Macronectes.sp.......Giant.petrel.sp..                 : int  0 0 0 0 0 0 0 0 3 0 ...
##  $ F..glacialis......Northern.fulmar.                     : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ D..capense......Cape.petrel.                           : int  1 0 0 0 0 0 0 0 0 0 ...
##  $ P..macroptera......Great.winged.petrel.                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..feae......Fea.s.petrel.                             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..incerta......Atlantic.petrel.                       : int  1 0 0 0 0 0 0 0 0 0 ...
##  $ P..arminjoniana......Trinidade.petrel.                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..mollis......Soft.plumaged.petrel.                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ B..bulwerii......Bulwer.s.petrel.                      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..aequinoctialis......White.chinned.petrel.           : int  9 1 7 5 4 7 0 8 8 4 ...
##  $ P..conspicillata......Spectacled.petrel.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Petrels......Petrel.sp..                               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Pachyptila.sp.......including.Halobaena.sp..           : int  0 0 0 0 0 0 0 1 0 0 ...
##  $ C..diomedea......Cory.s.shearwater.                    : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ C..edwardsii......Cape.Verde.shearwater.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..gravis......Great.shearwater.                       : int  38 29 32 22 297 17 5 8 0 3 ...
##  $ P..griseus......Sooty.shearwater.                      : int  0 0 0 0 0 0 0 0 0 2 ...
##  $ P..puffinus......Manx.shearwater.                      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..mauretanicus......Balearic.shearwater.              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..baroli......Macaronesian.shearwater.                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..lherminieri......Audubon.s.shearwater.              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..assimilis......Little.shearwater.                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Shearwaters......Shearwater.sp..                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ O..oceanicus......Wilson.s.storm.petrel.               : int  1 4 0 4 3 0 0 2 2 1 ...
##  $ G..nereis......Grey.backed.storm.petrel.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..marina......White.faced.storm.petrel.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ F..grallaria......White.bellied.storm.petrel.          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ O..castro......Madeiran.storm.petrel.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ O..leucorhoa......Leach.s.storm.petrel.                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ O..castro......including.Oceanodroma.leucorhoa.        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ H..pelagicus......European.storm.petrel.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Storm.petrels......Storm.petrel.sp..                   : int  0 0 2 0 0 0 0 0 0 0 ...
##  $ P..aethereus......Red.billed.tropicbird.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..lepturus......White.tailed.tropicbird.              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Tropicbirds......Tropicbird.sp..                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ F..aquila......Ascension.frigatebird.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ F..magnificens......Magnificent.frigatebird.           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ M..bassanus......Northern.gannet.                      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..capensis......Cape.gannet.                          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..sula......Red.footed.booby.                         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..leucogaster......Brown.booby.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ C..skua......Great.skua.                               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ C..maccormicki......South.polar.skua.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ C..antarctica......Antarctic.skua.                     : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..pomarinus......Pomarine.skua.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..parasiticus......Arctic.skua.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..longicaudus......Long.tailed.skua.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Skuas......Skua.sp..                                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ B..bernicla......Brent.goose.                          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ G..arctica......Black.throated.diver.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..capensis......Cape.cormorant.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..coronatus......Crowned.cormorant.                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..carbo......Great.cormorant.                         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ P..magellani......Magellanic.diving.petrel.            : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Pelecanoides.sp.......Diving.petrel.sp..               : int  0 0 0 0 0 0 0 0 0 2 ...
##  $ P..fulicarius......Red.phalarope.                      : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..canus......Common.gull.                             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..melanocephalus......Mediteranean.gull.              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..argentatus......Herring.gull.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..fuscus......Lesser.black.backed.gull.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..michahellis......Yellow.legged.gull.                : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..dominicanus......Cape.gull.                         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..marinus......Great.black.backed.gull.               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..ridibundus......Black.headed.gull.                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ L..minutus......Little.gull.                           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ R..tridactyla......Black.legged.kittiwake.             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ X..sabini......Sabine.s.gull.                          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ Gulls......Gull.sp..                                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..hirundo......Common.tern.                           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..arctica......Arctic.tern.                           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..dougallii......Roseate.tern.                        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..anaethetus......Bridled.tern.                       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..fuscata......Sooty.tern.                            : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ S..sandvicensis......Sandwich.tern.                    : int  0 0 0 0 0 0 0 0 0 0 ...
##   [list output truncated]
High_Temp <- filter(polar, Temp...C...Mid.mean.surface.water.temper.... >= 23)
High_Temp
ID..Consecutive.number.of.transec…. Date.Time..Starting.time..UTC..of.30.min…. Latitude..Mid.latitude.of.30.min.transe…. Longitude..Mid.longitude.of.30.min.trans…. Bathy.depth..m…Mid.mean.water.depth.of.30.mi…. Speed..kn…Average.speed.of.the.vessel.d…. Distance..km…Distance.covered.during.30.mi…. Sal..Mid.mean.surface.salinity.of….. Temp…C…Mid.mean.surface.water.temper…. F.chl..µg.l…Mid.fluorescence.of.30.min.tr…. Zone..Zones..which.were.defined.on….. E..chrysocome……Rockhopper.penguin. S..magellanicus……Magellanic.penguin. Penguins……Penguin.sp.. T..melanophris……Black.browed.albatross. T..cauta……Shy.albatross. T..chlororhynchos……Atlantic.yellow.nosed.albatross. D..exulans……Wandering.albatross. D..dabbenena……Tristan.albatross. Diomedea.sp…….Great.albatrosses.sp.. D..epomophora……Southern.royal.albatross. D..sanfordi……Northern.royal.albatross. D..epomophora……including.Diomedea.sanfordi. Albatrosses……Albatross.sp.. M..giganteus……Southern.giant.petrel. Macronectes.sp…….Giant.petrel.sp.. F..glacialis……Northern.fulmar. D..capense……Cape.petrel. P..macroptera……Great.winged.petrel. P..feae……Fea.s.petrel. P..incerta……Atlantic.petrel. P..arminjoniana……Trinidade.petrel. P..mollis……Soft.plumaged.petrel. B..bulwerii……Bulwer.s.petrel. P..aequinoctialis……White.chinned.petrel. P..conspicillata……Spectacled.petrel. Petrels……Petrel.sp.. Pachyptila.sp…….including.Halobaena.sp.. C..diomedea……Cory.s.shearwater. C..edwardsii……Cape.Verde.shearwater. P..gravis……Great.shearwater. P..griseus……Sooty.shearwater. P..puffinus……Manx.shearwater. P..mauretanicus……Balearic.shearwater. P..baroli……Macaronesian.shearwater. P..lherminieri……Audubon.s.shearwater. P..assimilis……Little.shearwater. Shearwaters……Shearwater.sp.. O..oceanicus……Wilson.s.storm.petrel. G..nereis……Grey.backed.storm.petrel. P..marina……White.faced.storm.petrel. F..grallaria……White.bellied.storm.petrel. O..castro……Madeiran.storm.petrel. O..leucorhoa……Leach.s.storm.petrel. O..castro……including.Oceanodroma.leucorhoa. H..pelagicus……European.storm.petrel. Storm.petrels……Storm.petrel.sp.. P..aethereus……Red.billed.tropicbird. P..lepturus……White.tailed.tropicbird. Tropicbirds……Tropicbird.sp.. F..aquila……Ascension.frigatebird. F..magnificens……Magnificent.frigatebird. M..bassanus……Northern.gannet. S..capensis……Cape.gannet. S..sula……Red.footed.booby. S..leucogaster……Brown.booby. C..skua……Great.skua. C..maccormicki……South.polar.skua. C..antarctica……Antarctic.skua. S..pomarinus……Pomarine.skua. S..parasiticus……Arctic.skua. S..longicaudus……Long.tailed.skua. Skuas……Skua.sp.. B..bernicla……Brent.goose. G..arctica……Black.throated.diver. P..capensis……Cape.cormorant. P..coronatus……Crowned.cormorant. P..carbo……Great.cormorant. P..magellani……Magellanic.diving.petrel. Pelecanoides.sp…….Diving.petrel.sp.. P..fulicarius……Red.phalarope. L..canus……Common.gull. L..melanocephalus……Mediteranean.gull. L..argentatus……Herring.gull. L..fuscus……Lesser.black.backed.gull. L..michahellis……Yellow.legged.gull. L..dominicanus……Cape.gull. L..marinus……Great.black.backed.gull. L..ridibundus……Black.headed.gull. L..minutus……Little.gull. R..tridactyla……Black.legged.kittiwake. X..sabini……Sabine.s.gull. Gulls……Gull.sp.. S..hirundo……Common.tern. S..arctica……Arctic.tern. S..dougallii……Roseate.tern. S..anaethetus……Bridled.tern. S..fuscata……Sooty.tern. S..sandvicensis……Sandwich.tern. T..maximus……Royal.tern. C..niger……Black.tern. T..bergii……Crested.tern. Terns……Tern.sp.. A..stolidus……Brown.noddy. U..aalge……Guillemot. A..torda……Razorbill. Alcidae.sp…….Alcidae.sp.. Seabird.unident……Seabird..unidentified. P..catodon……Sperm.whale. M..novaeangliae……Humpback.whale. B..physalus……Fin.whale. B..borealis……Sei.whale. B..acutorostrata……Minke.whale. B..brydei……Bryde.s.whale. G..melas……Long.finned.pilot.whale. G..macrorhynchus……Short.finned.pilot.whale. Globicephala.sp…….Pilot.whale.sp.. Z..cavirostris……Cuvier.s.beaked.whale. Beaked.whale……Beaked.whale.sp.. Whale.unident……Whale..unidentified. O..orca……Killer.whale. L..australis……Peale.s.dolphin. L..albirostris……White.beacked.dolphin. Lagenorhynchus.sp…….Lagenorhynchus.sp.. D..delphis……Common.dolphin. S..frontalis……Atlantic.spotted.dolphin. S..coeruleoalba……Striped.dolphin. S..clymene……Clymene.dolphin. T..truncatus……Bottlenose.dolphin. G..griseus……Risso.s.dolphin. S..bredanensis……Rough.toothed.dolphin. S..longirostris……Spinner.dolphin. Dolphin.unident……Dolphin..unidentified. P..phocoena……Harbour.porpoise. A..pusillus……South.African.fur.seal. C..caretta……Loggerhead.sea.turtle. C..mydas……Green.sea.turtle. D..coriacea……Leatherback.sea.turtle. Sea.turtles……Sea.turtle.sp.. Manta.sp…….Manta.ray. Ray……Ray. Hammerhead.shark……Hammerhead.shark. Shark……Shark. Mola.mola……Sun.fish.
135 2012-04-18T14:00 -31.42 -39.43 4661 9.6 8.8896 35.8645 23.0101 3.02 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
143 2012-04-19T09:00 -28.98 -39.00 4330 10.6 9.8156 35.9608 24.6779 2.71 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
144 2012-04-19T09:30 -28.89 -39.00 4196 10.7 9.9082 36.1643 24.8572 2.82 8 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
145 2012-04-19T10:00 -28.80 -39.00 4068 10.6 9.8156 36.0574 24.7066 2.84 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
146 2012-04-19T10:30 -28.70 -39.00 3916 10.6 9.8156 35.9939 24.6284 2.84 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

polar %>% mutate(temp_high_23 = ifelse(Temp...C...Mid.mean.surface.water.temper.... >= 23, TRUE, FALSE)) %>% 
  filter(temp_high_23 ==TRUE) ##creating a new column that shows which temp are greater than 23 - makes a new column in order to do the same thing as the first code

Ejercicio 5

En este ejercicio, vas a manipular la estructura de datos “parrot”.

a) Elimina las especies que nunca están registradas y también elimina la información que no vamos a utilizar: “longitud” (Longitude), “latitud” (Latitude) y “tiempo en minutos” (Time..min.).

b) Reemplaza los puntos en los nombres de especies por guiones utilizando la función str_replace().

c) Ahora que hemos manipulado la estructura de datos a nuestro gusto, crea un gráfico de barras (bar graph) visualizando la suma de abundancia para cada especie.

Haz clic aquí para solución!
parrot <- read.csv("parrot.csv")
head(parrot)
Longitude Latitude Code Time..min. Date.Time A..amazonica…. A..autumnalis…. A..barbadensis…. A..dufresniana…. A..farinosa…. A..festiva…. A..mercenaria…. A..ochrocephala….
-72.54740 10.31623 NM05 3 2010-03-15T11:13 0 0 0 0 0 0 0 0
-72.54267 10.31252 NM05 3 2010-03-15T11:06 0 0 0 0 0 0 0 0
-72.53757 10.31035 NM05 3 2010-03-15T10:59 0 0 0 0 0 0 0 0
-72.53145 10.30940 NM05 3 2010-03-15T10:54 0 0 0 0 0 0 0 0
-72.52523 10.30667 NM05 3 2010-03-15T10:46 0 0 0 0 0 0 0 0

parrot_clean_wrangle <- parrot %>%
  select(-`A..dufresniana....`, -`A..festiva....`, -`A..autumnalis....`, -`A..mercenaria....`) %>% 
  select(-Longitude, -Latitude, -`Time..min.`) %>% 
  rename(site = Code) 

colnames(parrot_clean_wrangle) <- str_replace(str_remove_all(colnames(parrot_clean_wrangle), "\\.\\.\\.\\."), "\\.\\.", "_")

head(parrot_clean_wrangle)
site Date.Time A_amazonica A_barbadensis A_farinosa A_ochrocephala
NM05 2010-03-15T11:13 0 0 0 0
NM05 2010-03-15T11:06 0 0 0 0
NM05 2010-03-15T10:59 0 0 0 0
NM05 2010-03-15T10:54 0 0 0 0
NM05 2010-03-15T10:46 0 0 0 0

parrot_clean_filter <- parrot_clean_wrangle %>% filter((A_amazonica != 0 | A_barbadensis != 0 | A_farinosa != 0 | A_ochrocephala != 0))

parrot_clean_filter %>%
   pivot_longer(names_to = "Species", values_to = "Abundance", A_amazonica:A_ochrocephala) %>%
  group_by(Species) %>%
  summarise(total_abundance = sum(Abundance)) %>%
  ggplot(aes(x = Species, y = total_abundance)) + geom_bar(stat = "identity")

Ejercicio 6

En este ejercicio, utiliza la estructura de datos original “butterfly_genus_site” para cambiar la estructura a formato ancho y asignar la nueva estructura al nombre “butterfly_wide”. Luego, cambia la nueva estructura “butterfly_wide” de nuevo a formato largo y asígnala a un objeto llamado “butterfly_long”, para practicar el uso de este tipo de funciones.

Haz clic aquí para solución!
butterfly_wide <- pivot_wider(butterfly_genus_site, names_from = Genus, values_from = n_spe)

butterfly_wide <- pivot_wider(butterfly_genus_site, names_from = Genus, values_from = n_spe, values_fill = 0)

butterfly_long <- pivot_longer(butterfly_wide, values_to = 'number_species', names_to = "genus", -sites_ID)

butterfly_long <- pivot_longer(butterfly_genus_site )